// {
//     let obj = {
//         time: '2017-03-11',
//         name: 'net',
//         _r: 123
//     };

//     console.log("obj", obj)
//     let monitor = new Proxy(obj, {
//         // 拦截对象属性的读取
//         get(target, key) {
//             return target[key].replace('2017', '2018')
//         },
//         // 拦截对象设置属性
//         set(target, key, value) {
//             if (key === 'name') {
//                 return target[key] = value;
//             } else {
//                 return target[key];
//             }
//         },
//         // 拦截key in object操作
//         has(target, key) {
//             if (key === 'name') {
//                 return target[key]
//             } else {
//                 return false;
//             }
//         },
//         // 拦截delete
//         deleteProperty(target, key) {
//             if (key.indexOf('_') > -1) {
//                 delete target[key];
//                 return true;
//             } else {
//                 return target[key]
//             }
//         },
//         // 拦截Object.keys,Object.getOwnPropertySymbols,Object.getOwnPropertyNames
//         ownKeys(target) {
//             return Object.keys(target).filter(item => item !== 'time')
//         }
//     })

//     // has 代理查看
//     console.log('get', monitor.time, obj.time);

//     monitor.time = '2018'; // 被拦截, 无效
//     monitor.name = 'mukewang';
//     console.log('set',monitor.time,monitor);

//     // has 代理
//     console.log('has', 'name' in monitor, 'time' in monitor);
//     console.log('has', 'name' in obj, 'time' in obj);

//     // deleteProperty 
//     delete monitor.time;
//     console.log('delete== time',monitor)
//     delete monitor._r
//     console.log('delete == _r',monitor)

//     console.log('ownKeys',Object.keys(monitor));
// }

// {
//     let obj = {
//         time: '2017-03-11',
//         name: 'net',
//         _r: 123
//     };

//     console.log('Reflect get', Reflect.get(obj, 'time'));
//     Reflect.set(obj, 'name', 'mukewang');
//     console.log(obj);
//     console.log('has', Reflect.has(obj, 'name'));
// }

{
    // 使用场景, 和业务解耦
    function validator(target,validator){
        return new Proxy(target,{
            _validator:validator,
            set(target,key,value,proxy){
                if(target.hasOwnProperty(key)){
                    let va = this._validator[key]
                    if(!!va(value)){
                        return Reflect.set(target,key,value,proxy)
                    }else{
                        throw Error(`不能设置${key}到${value}`)
                    }
                }else{
                    throw Error(`${key} 不存在`)
                }
            }
        })
    }

    // name 和 age 校验规则
    const personValidator={
        name(val){
            return typeof val === 'string'
        },
        age(val){
            return typeof val === 'number' && val >18;
        }
    }

    class Person{
        constructor(name,age){
            this.name = name;
            this.age = age;
            return validator(this,personValidator)
        }
    }

    // 赋值的时候不进入代理, 可以随意设置
    const person = new Person('lilei',30)
    console.log(person)

    /**
     * 设置的时候, 进入代理, 代理返回的对象
     * 
     * 好处: 可以保证对象只有我们要的属性和确定的值
     * 对象扩展完全可控
     */
    // person.age = 'asadasd' // 会抛出异常


}